# -*- coding: utf-8 -*-
import math
import random
import time
import traceback
from legendaryPowerScript.fighters import Fighter
from yaml import YAMLError
from redis import StrictRedis
import apolloCommon.redisPool as redisPool
import mod.server.extraServerApi as serverApi
from legendaryPowerScript._lpcommon.pluginManager import PluginManager
from legendaryPowerScript.gameSys import LegendaryPowerSys
from legendaryPowerScript.scheduler import Scheduler
from mod_log import logger
from legendaryPowerScript.syncinv.savedDb import SavedDbManager
def getPluginManager():
    # type: () -> PluginManager
    """
    插件管理类，请在插件的__init__中调用 apiUtil.getPluginManager().registerPlugin(self) 将插件注册
    Returns：
        - mgr (PluginManager)：插件管理类
    """
    return PluginManager()


def getSavedDb():
    # type: () -> SavedDbManager
    """
    存档管理器。若您的插件需要对玩家存档、加载存档，请使用其中的 registerLoader 方法。
    Returns:
        SavedDbManager: 存档管理器
    """
    return SavedDbManager()


def getFighterByName(name):
    # type: (str) -> Fighter
    """
    根据名称获取实体对象。函数接受一个字符串类型的参数name，根据名称的前缀进行不同的处理逻辑：
    若以“uid:”开头：根据提供的UID获取对应在线玩家的实体对象
    若以“id:”开头：根据提供的实体ID获取对应实体
    否则：根据提供的玩家名获取对应在线玩家的实体对象
    如果找不到对应的实体，则返回None。

    Args:
        name (str): 实体ID。

    Returns:
        Fighter or None: 实体对象。如果找不到对应的实体，则返回None。
    """
    pass

def getFighterById(entityId):
    # type: (str) -> Fighter
    """
    根据名称获取实体对象。函数接受一个字符串类型的参数entityId，表示实体ID。
    若以“uid:”或“id:”开头：改为调用getFighterByName
    若此实体已存在缓存中：返回该Fighter实例
    否则：
    若实体ID存在：创建一个新的Fighter实例，并触发FighterInit事件，最后返回创建的实例
    若不存在：返回None

    Args:
        entityId (str): 实体ID。

    Returns:
        Fighter or None: 斗士对象。如果找不到对应的斗士，则返回None。
    """
    pass

def getSpell(name):
    # type: (str) -> Spell
    """
    根据名称获取魔法。

    Args:
        name (str): 魔法名称。

    Returns:
        Spell: 指定名称的魔法实例，如果不存在则返回None。
    """
    return Spell()


def getMobManager():
    # type: () -> MobManager
    """
    获取怪物管理器实例。可以根据玩家UID生成其怪物类型，或是获取yml中配置的怪物类型

    Returns:
        MobManager: 怪物管理器实例。
    """
    return MobManager()


def getItemType(name):
    # type: () -> None
    """
    这是一个Python函数，接受一个字符串参数name，并返回一个ItemType类型的值。函数会根据传入的name不同进行不同的处理：
    如果name在_itemtypes中，则直接返回它对应的ItemType类型的值；
    如果name中包含"minecraft:"，则返回一个对应原版物品的ItemType类型；
    否则，返回None。
    """
    pass

def getFighterById(entityId):
    # type: (str) -> Fighter or None
    """
    根据名称获取实体对象。函数接受一个字符串类型的参数entityId，表示实体ID。
    若以“uid:”或“id:”开头：改为调用getFighterByName
    若此实体已存在缓存中：返回该Fighter实例
    否则：
    若实体ID存在：创建一个新的Fighter实例，并触发FighterInit事件，最后返回创建的实例
    若不存在：返回None

    Args:
        entityId (str): 实体ID。

    Returns:
        Fighter or None: 斗士对象。如果找不到对应的斗士，则返回None。
    """
    return Fighter()


def getFighterByName(name):
    # type: (str) -> Fighter or None
    """
    根据名称获取实体对象。函数接受一个字符串类型的参数name，根据名称的前缀进行不同的处理逻辑：
    若以“uid:”开头：根据提供的UID获取对应在线玩家的实体对象
    若以“id:”开头：根据提供的实体ID获取对应实体
    否则：根据提供的玩家名获取对应在线玩家的实体对象
    如果找不到对应的实体，则返回None。

    Args:
        name (str): 实体ID。

    Returns:
        Fighter or None: 实体对象。如果找不到对应的实体，则返回None。
    """
    return Fighter()


def parseCommand(fighter, target, expression):
    # type: (Fighter, Fighter or Vector or None, str) -> None
    """
    依据以下规则替换字符串expression:
        %tl = target的坐标，格式为 x,y,z
        %n = target的显示名
        %lf = fighter的等级
        %l = target的等级
        %c = fighter的标识符（用于指令）
        %t或%p = target的标识符（用于指令）
        [变量名] = fighter的变量值
        [t:变量名] = target的变量值
        {python表达式} = 表达式的运算结果
    Args:
        fighter (Fighter): 实体1
        target (Fighter or Vector or None): 实体2
        expression (str): 要处理的字符串
    """
    pass

def SendMailTo(uids, title, content, items, expire, sender):
    # type: (list[str] or str, str, str, list[LegendaryItem], str) -> None
    """
    给指定的玩家发送邮件
    Args:
        uids (list[str] or str): 接受邮件的玩家，填入玩家UID。若用列表则同时发给多个玩家
        title (str): 邮件标题
        content (str): 邮件正文
        items (list[LegendaryItem]): 邮件持续时间，单位秒
        sender (str): 发送者的名字
    """
    pass

def convertEncode(value):
    # type: (list or dict or str) -> object
    """
    给指定的玩家发送邮件
    Args:
        value (list or dict or str): 将该对象中的UTF-8编码或unicode转码为可读取的格式。mysql中存储的都是unicode哦
    Returns:
        value (object)：转码后的value
    """
    pass

def getAmountInt(amountStr, multiplier=1.0):
    # type: (str, float) -> int
    """
    同下，但是返回的是整数
    如果传入的是1.8，那么有20%概率返回1,80%概率返回2
    Args:
        value (str): 表达式
        multiplier (float): 生成的数会被乘以这个数，默认1.0
    Returns:
        amount (int)：生成的数
    """
    return 0


def getAmount(amountStr, multiplier=1.0):
    # type: (str, float) -> float
    """
    根据amountStr的格式生成随机数
    支持传入的格式：
        1: 返回1
        5~10.8: 返回5~10.8之中的随机一个小数
        90%5~10%10：同上，但是会有很大的概率生成较小的数。返回5的概率是10.8的9倍，数字越大，生成的概率线性降低
    Args:
        value (str): 表达式
        multiplier (float): 生成的数会被乘以这个数，默认1.0
    Returns:
        amount (float)：生成的数
    """
    return 0.0


def stripColor(s):
    # type: (str) -> str
    """
    移除字符串中的所有颜色代码
    Args:
        text (str): 任意字符串
    Returns:
        text (str): 移除颜色代码后的字符串
    """
    return ""


def getStrWidth(s):
    """
    获取字符串在屏幕上显示的长度，注意因为是自己写的计算，会有一些偏差
    Args:
        text (str): 任意字符串
    Returns:
        length (int): 屏幕显示的长度
    """
    pass

def registerListener(name, id, cb):
    # type: (str, str, callable) -> None
    """
    监听起源工艺引擎触发的事件，注意不是MC原生的事件！
    可用的事件及其参数见文档
    Args:
        name (str): 事件名
        id (str): 监听器的ID
        cb (callable): 事件触发时的回调，接受一个参数，即事件信息
    """
    pass

def floorHealth(amount):
    # type: (int/float) -> None
    """
    将数值取整，除了前两位以外都变成0

    参数：
        - amount (int/float)：待取整的数值

    返回：
        - int/float：取整后的数值
    """
    pass

def calcYear(amount, toStr=True):
    # type: (int/float, bool) -> None
    """
    计算斗罗的年限

    参数：
        - amount (int/float)：待计算的年龄数值
        - toStr (bool)：是否将结果转换为字符串，默认为True

    返回：
        - int/str：计算得到的年限（可选转换为字符串）
    """
    pass

def formatNumber(num):
    # type: (int/str) -> None
    """
    格式化数值显示，添加“亿”或“万”单位

    参数：
        - num (int/str)：待格式化的数值

    返回：
        - str：格式化后的数值字符串
    """
    pass

def formatTimeLeft(seconds, short=True):
    # type: (int, bool) -> str
    """
    格式化时间
    若传入seconds=3680：
    若short=True：则只返回最大的时间单位，即“1小时”
    否则，返回详细时间，即“1小时1分钟20秒”

    参数：
        - seconds (int)：剩余秒数
        - short (bool)：是否不显示尾数，默认为True。

    返回：
        - s (str)：格式化后的剩余时间字符串
    """
    return ""


def GetClientSystem():
    """
    返回当前Mod的system对象
    :return: 当前Mod的system对象
    :rtype: neteaseBattleScript.battleClientSystem.BattleClientSystem
    """
    pass

def GetScheduler():
    # type: () -> Scheduler
    """
    获取计时器，可用于定时执行任务

    Returns:
        Scheduler: 计时器实例。
    """
    pass

def executeCommand(sender, messages):
    """
    执行指令

    参数：
        - sender (str)：发送者
        - messages (list/str)：指令列表或单个指令

    返回：
        无
    """
    pass

def getCnFirstLetter(str):
    # type: (str) -> str
    """
    获取中文字符串的首字母，如“我的世界”则返回“wdsj"。多音字会返回GBK编码中靠前的音，如”长按“返回"ca"，需要注意

    参数：
        - str (str)：中文字符串

    返回：
        - strReturnCn (str)：中文字符串的首字母
    """
    return ""


def KillEntity(entityId, checkItem=False, removeEngineEntity=True, handleDeath=True):
    """
    杀死实体，并自动处理好杀死实体后的内存回收

    参数：
        - entityId (str/int)：实体ID
        - checkItem (bool)：是否检查物品，默认为False
        - removeEngineEntity (bool)：是否移除引擎实体，默认为True
        - handleDeath (bool)：是否处理死亡行为，默认为True

    返回：
        无
    """
    pass

def requestService(eventName, data, channel="serviceBase", callback=None):
    # type: (str, obj, str, func) -> None
    """
    向service服务器发送一个包

    参数：
        - eventName (str)：事件名称
        - data (obj)：传递的数据
        - channel (str)：通道名称，默认为"serviceBase"
        - callback (func)：回调函数，默认为None

    返回：
        无
    """
    pass

def readColor(s):
    # type: (str) -> tuple[float, float, float]
    """
    从“R,G,B”格式的字符串中读取颜色

    参数：
        - s (str)：颜色字符串

    返回：
        - color (tuple[float, float, float])：颜色值的元组，每个值为0~1。如(1,1,1)为白色
    """
    pass

